#ifndef _DISP_MANAGER_H
#define _DISP_MANAGER_H


#ifndef NULL
#define NULL (void *)0
#endif



/*  
    形参命名规则：
    DispBuff 是结构体，PDispBuff 是其指针类型，
    函数参数 ptDispBuff 中的 pt 表示指向结构体的指针（p 指针 + t 结构体）
 */



typedef struct DispBuff {
	int iXres;
	int iYres;
	int iBpp;
	unsigned char *buff;
}DispBuff, *PDispBuff;



// 定义显示区域结构体
typedef struct Region {
	int iLeftUpX; // 矩形区域左上角坐标
	int iLeftUpY;
	int iWidth; // 矩形区域的高宽
	int iHeigh;
}Region, *PRegion;



// 定义显示设备操作结构体（在显示设备上显示或者刷新内容）
typedef struct DispOpr {
	char *name; // 显示设备名称（需要对哪个显示设备进行操作）
    int (*DeviceInit)(void);
    int (*DeviceExit)(void);
	int (*GetBuffer)(PDispBuff ptDispBuff);
	int (*FlushRegion)(PRegion ptRegion, PDispBuff ptDispBuff); // 把DispBuff的内容刷到Region上
    struct DispOpr *ptNext;
}DispOpr, *PDispOpr;


// 头文件中也是，不需要出现对framebuffer的操作
int PutPixel(int x, int y, unsigned int dwColor);
void RegisterDispDevice(DispOpr *ptDispOpr);
int ChooseDefaultDevice(char *name);
int InitDefaultDevice(void);
PDispBuff GetDeviceBuffer(void);
int FlushDeviceRegion(PRegion ptRegion, PDispBuff ptDispBuff);
int RegisterAllDispDevs(void);


#endif